from flask import Blueprint, request, jsonify, make_response, \
    redirect, g
import json
from application import app, db
from common.models.User import User
from common.libs.user.UserService import UserService
from common.libs.UrlManager import UrlManager
from common.libs.Helper import ops_render

route_user = Blueprint('user_page', __name__)

@route_user.route("/login", methods=["GET", "POST"])
def login():
    if request.method == 'GET':
        return ops_render("user/login.html")

    resp = {'code': 200, 'msg': '登录成功', 'data': {}}
    req = request.values
    login_name = req['login_name'] if 'login_name' in req else ''
    login_pwd = req['login_pwd'] if 'login_pwd' in req else ''

    if login_name is None or len(login_name) < 1:
        resp['code'] = -1
        resp['msg'] = "请输入正确的登录用户名~~"
        return jsonify(resp)

    if login_pwd is None or len(login_pwd) < 1:
        resp['code'] = -1
        resp['msg'] = "请输入正确的登录密码~~"
        return jsonify(resp)

    user_info = User.query.filter_by(login_name=login_name).first()
    if not user_info:
        resp['code'] = -1
        resp['msg'] = '请输入正确的登录用户名和密码~~'
        return jsonify(resp)

    if user_info.login_pwd != UserService.genePwd(login_pwd, user_info.login_salt):
        resp['code'] = -1
        resp['msg'] = "请输入正确的登陆用户名和密码~~"
        return jsonify(resp)

    if user_info.status != 1:
        resp['code'] = -1
        resp['msg'] = "账户被禁用，请联系网站管理员~~"
        return jsonify(resp)

    response = make_response(json.dumps(resp))
    response.set_cookie(app.config['AUTH_COOKIE_NAME'], "{0}#{1}".format(UserService.geneAuthCode(user_info), user_info.uid), 60*60*24*120, httponly=True)  # 保存120天

    return response

# 编辑用户信息
@route_user.route("/edit", methods=['GET', 'POST'])
def edit():
    if request.method == 'GET':
        return ops_render("user/edit.html", {'current': 'edit'})

    resp = {'code': 200, 'msg': '操作成功', 'data': {}}
    req = request.values
    nickname = req['nickname'] if 'nickname' in req else ''
    email = req['email'] if 'email' in req else ''

    if nickname is None or len(nickname) < 1:
        resp['code'] = -1
        resp['msg'] = '请输入符合规范的姓名'
        return jsonify(resp)

    if email is None or len(email) < 1:
        resp['code'] = -1
        resp['msg'] = '请输入符合规范的邮箱'
        return jsonify(resp)
    # 获取全局变量中的用户信息，并修改
    user_info = g.current_user
    user_info.nickname = nickname
    user_info.email = email

    # 提交数据库
    db.session.add(user_info)
    db.session.commit()

    return jsonify(resp)

# 密码重置
@route_user.route("/reset-pwd", methods=['GET', 'POST'])
def resetPwd():
    if request.method == 'GET':
        return ops_render("user/reset_pwd.html", {'current': 'reset-pwd'})
    resp = {'code': 200, 'msg': '操作成功', 'data': {}}
    req = request.values

    old_password = req['old_password'] if 'old_password' in req else ''
    new_password = req['new_password'] if 'new_password' in req else ''

    if old_password is None or len(old_password) < 6:
        resp['code'] = -1
        resp['msg'] = '请输入符合规范的原密码'
        return jsonify(resp)

    if new_password is None or len(new_password) < 6:
        resp['code'] = -1
        resp['msg'] = '请输入符合规范的新密码'
        return jsonify(resp)

    if old_password == new_password:
        resp['code'] = -1
        resp['msg'] = '原密码和新密码不能相同，请重新输入'
        return jsonify(resp)

    user_info = g.current_user
    # 判断原密码是否正确
    if user_info.login_pwd != UserService.genePwd(old_password, user_info.login_salt):
        resp['code'] = -1
        resp['msg'] = "原密码不正确~~"
        return jsonify(resp)

    user_info.login_pwd = UserService.genePwd(new_password, user_info.login_salt)
    db.session.add(user_info)
    db.session.commit()

    # 更新用户cookie，
    response = make_response(json.dumps(resp))
    response.set_cookie(app.config['AUTH_COOKIE_NAME'], "{0}#{1}".format(UserService.geneAuthCode(user_info), user_info.uid), 60*60*24*120, httponly=True)  # 保存120天
    return response

# 退出登录，删除cookie
@route_user.route("/logout")
def logout():
    response = make_response(redirect(UrlManager.buildUrl("user/login")))
    response.delete_cookie(app.config['AUTH_COOKIE_NAME'])
    return response
